#include "dec2bin.h"

struct pilha {
    int no[MAX];
    int topo;
};

Pilha cria_pilha()
{
    Pilha p;
    p = (Pilha) malloc(sizeof(struct pilha));

    if(p != NULL)
        p->topo = -1;
    return p;
}

int pilha_vazia(Pilha p)
{
    if(p->topo == -1)
        return 1;
    return 0;
}

int pilha_cheia(Pilha p)
{
    if(p->topo == MAX-1)
        return 1;
    return 0;
}

int push(Pilha p, int elem)
{
    if(p == NULL || pilha_cheia(p))
        return 0;

    /* Insere o elemento */
    p->topo++;
    p->no[p->topo] = elem;

    return 1;
}

int pop(Pilha p, int *elem)
{
    if(pilha_vazia(p) || p == NULL)
        return 0;

    *elem = p->no[p->topo]; /* Retorna o elemento */
    p->topo--; /* Remove o elemento do topo */
    return 1;
}

int le_topo(Pilha p, int *elem)
{
    if(p == NULL || pilha_vazia(p))
        return 0;

    *elem = p->no[p->topo];
    return 1;
}

int imprime_pilha(Pilha p)
{
    if(p == NULL || pilha_vazia(p))
        return 0;

    int i;
    for(i = p->topo;i != -1;i--)
        printf("%d", p->no[i]);
    return 1;
}

Pilha dec2bin(int elem)
{
    int resto = 0;
    Pilha P = cria_pilha();
    if(P == NULL)
    {
        printf("Erro:\n\tErro ao alocar a pilha\n");
        exit(0);
    }

    while(elem != 0)
    {
        resto = elem % 2;
        push(P, resto);
        elem /= 2;
    }

    if(pilha_cheia(P))
    {
        printf("Erro:\n\tEstouro de pilha\n");
        exit(0);
    }

    return P;
}
